﻿Namespace Operaties

    ''' <summary>
    ''' Alle operaties op ArtikelsDataSet
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ArtikelsBL

        ''' <summary>
        ''' Maak een nieuwe verkoop aan met de nodige velden correct ingevuld
        ''' </summary>
        ''' <param name="totaalTelling"></param>
        ''' <param name="commentaarBegintotaal"></param>
        ''' <param name="soortId"></param>
        ''' <returns></returns>
        Public Shared Function InitialiseerVerkoop(ByVal totaalTelling As Decimal, _
                        ByVal commentaarBegintotaal As String, ByVal soortId As Integer, ByVal idWinkelier As Integer) As ArtikelsDataSet.VerkopenRow
            Dim verkoopRow As ArtikelsDataSet.VerkopenRow = Utility.Data.Verkopen.NewVerkopenRow()
            verkoopRow.IdKlant = Constants.DEFAULT_KLANT_ID
            verkoopRow.CashBetaald = True
            verkoopRow.IdWinkelier = idWinkelier
            verkoopRow.IdSoort = soortId
            verkoopRow.Datum = DateTime.Today()
            verkoopRow.Tijd = "Niet van toepassing"
            verkoopRow.Begintotaal = totaalTelling
            verkoopRow.Eindtotaal = totaalTelling ' meer realistisch dan 0 als het formulier zou crashen (als je het dan later afdrukt, krijg je evenveel tekort als op de volgende verkoop teveel)
            verkoopRow.CommentaarBegintotaal = commentaarBegintotaal
            verkoopRow.CommentaarEindtotaal = ""
            verkoopRow.InUitKasBedrag = 0D
            verkoopRow.InUitKasReden = ""
            verkoopRow.NaarBankBedrag = 0D
            verkoopRow.NaarBankNaam = ""
            verkoopRow.NaarBankReferentie = ""
            verkoopRow.FactuurNummer = 0
            verkoopRow.IsFactuurBehandeld = False
            verkoopRow.Omschrijving = ""
            verkoopRow.BedragBancontact = 0D
            verkoopRow.BedragMaaltijdcheques = 0D
            Utility.Data.Verkopen.AddVerkopenRow(verkoopRow)
            Return verkoopRow
        End Function

        ''' <summary>
        ''' Alle gewijzigde verkoopsdetails van de verkoop worden overgezet naar een nieuwe leveringsbon
        ''' </summary>
        ''' <param name="verkoop"></param>
        ''' <param name="idKlant"></param>
        ''' <param name="omschrijving"></param>
        ''' <param name="idWinkelier"></param>
        ''' <param name="consignatie"></param>
        ''' <returns>Id van de verkoop die de leveringsbon bevat</returns>
        Public Shared Function VerkoopsDetailsBewarenBijNieuweLeveringsbon(ByVal verkoop As ArtikelsDataSet.VerkopenRow, _
                 ByVal idKlant As Integer, ByVal omschrijving As String, ByVal idWinkelier As Integer, ByVal consignatie As Boolean) As Integer
            'Maak een nieuwe verkoop on the fly
            Dim leveringsbonRow As ArtikelsDataSet.VerkopenRow = InitialiseerVerkoop(0D, "Leveringsbon", Constants.VerkoopsoortIds.FACTUUR, idWinkelier)
            leveringsbonRow.CashBetaald = False
            leveringsbonRow.Eindtotaal = 0D ' Me._myVerkoopRow.Eindtotaal
            leveringsbonRow.Omschrijving = "Leveringsbon winkelverkoop"
            leveringsbonRow.IdKlant = idKlant
            leveringsbonRow.Omschrijving = omschrijving
            leveringsbonRow.Consignatie = consignatie

            ' voeg eerst de verkoop toe
            Dal.VerkoopToevoegen(leveringsbonRow)

            ' bewaar de details en pas de voorraad aan in de Artikels-tabel
            Dal.VerkoopsDetailsBewarenBijBestaandeLeveringsbon(verkoop, leveringsbonRow.Id, consignatie)
            Return leveringsbonRow.Id
        End Function

        Public Shared Function LaatsteVerkoopEindTotaalOphalen() As Decimal
            Return LaatsteVerkoopEindTotaalOphalen(0)
        End Function

        Public Shared Function LaatsteVerkoopEindTotaalOphalen(ByVal behalveVerkoopMetId As Integer) As Decimal
            Return From v In Utility.Data.Verkopen _
                   Where v.Eindtotaal <> 0 _
                   And v.Id <> behalveVerkoopMetId _
                   Select v _
                   Order By v.Id Descending _
                   .First().Eindtotaal
        End Function

        Public Shared Function NieuwFactuurNummerOphalen() As Integer
            Return From v In Utility.Data.Verkopen _
                   Where Not v.IsFactuurNummerNull _
                   Select v _
                   Order By v.FactuurNummer Descending _
                   .First().FactuurNummer + 1
        End Function

        ''' <summary>
        ''' Verwijdert alle verkoopsdetails, de verkoop zelf en herstelt de voorraad.
        ''' </summary>
        ''' <param name="idVerkoop"></param>
        Public Shared Sub DeleteVerkoop(ByVal idVerkoop As Integer)
            If (Utility.Data.HasChanges()) Then
                Throw New Exception("Er zijn nog niet bewaarde wijzigingen. Sla deze eerst op")
            End If
            Dim verkoop As ArtikelsDataSet.VerkopenRow = Utility.Data.Verkopen.FindById(idVerkoop)
            For Each d As ArtikelsDataSet.VerkoopsDetailsRow In verkoop.GetVerkoopsDetailsRows()
                d.ArtikelsRow.VerwachteVoorraad += d.Aantal ' voorraad herstellen
                d.Delete()
            Next
            verkoop.Delete()
            Dal.Bijwerken(Utility.Data.VerkoopsDetails)
            Dal.Bijwerken(Utility.Data.Artikels)
            Dal.Bijwerken(Utility.Data.Verkopen)
        End Sub

        Public Shared Function GetEersteVerkoopbaarArtikelMetBarcode(ByVal barcode As String) As ArtikelsDataSet.ArtikelsRow
            Dim eersteArtikelMetDezeBarcode As ArtikelsDataSet.ArtikelsRow = _
                            (From a In Utility.Data.Artikels _
                            Where a.Barcode = barcode _
                            AndAlso (a.IsVerkoopbaarNull OrElse a.Verkoopbaar) _
                            Select a).FirstOrDefault
            Return eersteArtikelMetDezeBarcode
        End Function

    End Class

End Namespace
